// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.math.BigDecimal;
// import java.util.Collections;
// import java.util.List;
#pragma once
#include <list>
#include <string>
#include "../SQLExprImpl.h"

class SQLSizeExpr_Unit
{
public:
  static SQLSizeExpr_Unit B;
  static SQLSizeExpr_Unit K;
  static SQLSizeExpr_Unit M;
  static SQLSizeExpr_Unit G;
  static SQLSizeExpr_Unit T;
  static SQLSizeExpr_Unit P;
  static SQLSizeExpr_Unit E;

  uint64_t mask;
  string_ptr  name;
  SQLSizeExpr_Unit(uint64_t mask, string_ptr  name);
  static std::shared_ptr<SQLSizeExpr_Unit> valueOf(string_ptr  name);
};

class SQLSizeExpr : public SQLExprImpl
{
public:
  SQLExpr_ptr value;
  std::shared_ptr<SQLSizeExpr_Unit> unit;

  SQLSizeExpr();

  SQLSizeExpr(string_ptr  value, char unit);

  SQLSizeExpr(SQLExpr_ptr value, std::shared_ptr<SQLSizeExpr_Unit> unit);
  SHAREDOBJECT(SQLSizeExpr);

  //@Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLObject_list_ptr  getChildren();

  SQLExpr_ptr getValue();

  void setValue(SQLExpr_ptr value);

  std::shared_ptr<SQLSizeExpr_Unit> getUnit();

  void setUnit(std::shared_ptr<SQLSizeExpr_Unit> unit);

  virtual SQLObject_ptr clone();

  //@Override
  bool equals(Object_ptr o);

  //@Override
  int hashCode();
};
